//TODO 多态:父类的引用指向子类的对象,不同类型的对象针对相同的方法,产生了不同的行为
(() => {
    //定义一个父类
    class Animal {
        name: string

        //定义一个构造函数
        constructor(name: string) {
            //初始化
            this.name = name
        }

        run(distance: number = 0) {
            console.log(`跑了${distance}这么远的距离`, this.name)
        }
    }

    //定义一个子类
    class Dog extends Animal {
        constructor(name: string) {
            //调用父类的构造函数实现子类中子类的初始化操作
            super(name);
        }

        //实例方法,重写父类中的实例方法
        run(distance: number = 5) {
            console.log(`跑了${distance}这么远的距离`, this.name)
        }
    }

    //定义一个子类
    class Pig extends Animal {
        constructor(name: string) {
            //调用父类的构造函数实现子类中子类的初始化操作
            super(name);
        }

        //实例方法,重写父类中的实例方法
        run(distance: number = 10) {
            console.log(`跑了${distance}这么远的距离`, this.name)
        }
    }

    //实例化父类对象
    const ani: Animal = new Animal('动物')
    ani.run()
    //实例化子类对象
    const dog: Dog = new Dog('狗')
    dog.run()
    //实例化子类对象
    const pig: Pig = new Pig('猪')
    pig.run()


    console.log('===================================')
    //父类和子类的关系:父子关系,父类类型创建子类的对象----多态
    const dog1: Animal = new Dog('多态狗')
    dog1.run()
    const pig1: Animal = new Pig('多态猪')
    pig1.run()


    //用法--该函数需要的参数是Animal类型的
    function showMsg(ani: Animal) {
        ani.run()
    }

    showMsg(dog1)
    showMsg(pig1)
})()
//多态  9.15